package com.itic.appbase.applications.sys.relation.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itic.appbase.applications.sys.relation.persistence.dao.RoleResourceDao;
import com.itic.appbase.applications.sys.relation.persistence.model.RoleResource;
import com.itic.appbase.applications.sys.relation.persistence.model.RoleResourceExample;
import com.itic.appbase.applications.sys.resource.vo.ResourceVo;
import com.itic.appbase.framework.common.constants.DBConst;
import com.itic.appbase.framework.common.service.CrudService;
import com.itic.appbase.framework.utils.StringHelper;

@Service
@Transactional
public class RoleResourceService
        extends CrudService<RoleResourceDao, RoleResource, RoleResourceExample> {
    @Autowired
    private RoleResourceDao roleResourceDao;

    /**
     * 根据角色id,查询角色在整个资源表中所拥有的资源
     * 
     * @param map
     *            </br>key1:dbTrue idEffective 是否可用
     *            </br>key:idList 角色id组成的list集合
     * @return
     */
    public List<ResourceVo> selectResourceByRoleId(List<String> idList) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("dbTrue", DBConst.TRUE);// 可用的代码表
        map.put("idList", idList);// 角色id组成的list集合
        return roleResourceDao.selectResourceByRoleId(map);
    }

    /**
     * 角色授权
     * 1、判断该角色是否存在资源信息
     * 2、存在资源信息,则删除原有资源信息
     * 3、保存新的角色资源信息
     * 
     * @param roleId
     * @param resourceIds
     * @return
     */
    public String authorize(String roleId, String resourceIds) {
        // 封装角色资源对象
        List<RoleResource> rList = new ArrayList<RoleResource>();
        if (StringHelper.isNotBlank(resourceIds)) {
            String[] resources = resourceIds.split(",");
            for (int i = 0; i < resources.length; i++) {
                // 角色资源
                RoleResource roleResource = new RoleResource();
                roleResource.setRoleId(roleId);// 角色id
                roleResource.setResourceId(resources[i]);// 资源ID

                roleResource = this.initDefalutFields(roleResource);// 设置角色资源-6个必填字段
                rList.add(roleResource);
            }
        }

        // 1、判断该角色是否存在资源信息
        // 封装查询条件
        RoleResourceExample roleResourceExample = new RoleResourceExample();
        roleResourceExample.createCriteria().andIsEffectiveEqualTo(DBConst.TRUE).andRoleIdEqualTo(roleId);
        List<RoleResource> recordList = roleResourceDao.selectByExample(roleResourceExample);
        if (recordList != rList && !recordList.isEmpty()) {
            // 2、存在资源信息,则删除原有资源信息
            int deleteCount = roleResourceDao.deleteByExample(roleResourceExample);
            if (deleteCount < 0) {
                return FAILED;
            }
        }
        // 3、保存新的角色资源信息
        if (null != rList && !rList.isEmpty()) {
            for (RoleResource roleResource : rList) {
                int code = roleResourceDao.insert(roleResource);
                if (code < 0) {// 添加失败
                    return FAILED;
                }
            }
        }
        return SUCCESS;
    }
}